package pe.edu.upc.dew.discoteca.controller;

import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.FacebookException;
import com.restfb.Parameter;
import com.restfb.types.User;
import java.util.Hashtable;
import java.util.List;
import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import pe.edu.upc.dew.discoteca.model.Contacto;
import pe.edu.upc.dew.discoteca.service.DiscotecaService;
import pe.edu.upc.dew.discoteca.model.Discoteca;
import pe.edu.upc.dew.discoteca.model.Lista;
import pe.edu.upc.dew.discoteca.model.Persona;
import pe.edu.upc.dew.discoteca.service.UsuarioService;
import pe.edu.upc.dew.discoteca.utiles.Utiles;

/**
 *
 * @author elvis
 */
@Controller
public class DiscotecasController {

    private static final Logger logger = Logger.getLogger(DiscotecasController.class);
    
    @Autowired
    private DiscotecaService discotecaService;
    @Autowired
    private UsuarioService usuarioService;


    @RequestMapping( method = RequestMethod.GET)
    public String intro( ModelMap model,HttpServletRequest req ){
        logger.debug("metodo intro GET");
        Lista l = new Lista();
        //request.userPrincipal
        try {
        org.springframework.security.userdetails.User user = (org.springframework.security.userdetails.User)(SecurityContextHolder.getContext().getAuthentication().getPrincipal());
        logger.debug(user);
        Persona per = usuarioService.obtenerPersona(user.getUsername());
        l.setCodigoPersona(per);
       } catch (Exception e) {
          e.printStackTrace();
          req.setAttribute("msgError", "usuario no encontrado");
       }
        
        req.getSession().setAttribute("listaNu", l);
        return reserva1(model,req);
    }

    @RequestMapping( method = RequestMethod.GET)
    public String reserva1( ModelMap model ,HttpServletRequest req ){
        logger.debug("metodo reserva1 GET");
        model.addAttribute( new Lista() );
        logger.debug(discotecaService.listarDiscotecas().size());
        model.addAttribute( "discos", discotecaService.listarDiscotecas() );
        return "discotecas/reserva1";
    }

    @RequestMapping( method = RequestMethod.POST)
    public String reserva2(@Valid Lista lista,BindingResult result,@RequestParam("codigoDiscoteca.codigo") String codigo,@RequestParam("fecha") String fecha, ModelMap model ,HttpServletRequest req){
        logger.debug("metodo reserva2 POST");
        Discoteca dis = discotecaService.buscarDiscotecaN(codigo);
        Lista milista = (Lista)req.getSession().getAttribute("listaNu");

        try {
            milista.setFecha(Utiles.stringToDate(fecha, Utiles.FORMATO_FECHA_CORTA));
            milista.setCodigoDiscoteca(dis);
            req.getSession().setAttribute("discot", dis);
            model.addAttribute( new Contacto() );
            model.addAttribute("lista", milista);
            model.addAttribute("contactos", milista.getContactoList());
            return "discotecas/reserva2";
        } catch (Exception e) {
            e.printStackTrace();
            return "discotecas/reserva1";
        }
    }

    @RequestMapping( method = RequestMethod.GET)
    public String reserva2(ModelMap model,HttpServletRequest req){
        logger.debug("metodo reserva GET");
       Lista milista = (Lista)req.getSession().getAttribute("listaNu");
       model.addAttribute( new Contacto() );
       model.addAttribute("contactos", milista.getContactoList());
       return "discotecas/reserva2";
    }

    @RequestMapping( method = RequestMethod.POST)
    public String agregar( @Valid Contacto contacto,BindingResult result, ModelMap model,HttpServletRequest req ){
        logger.debug("Metodo 'agregar' POST ... agrego un nuevo contacto");
        Lista milista = (Lista)req.getSession().getAttribute("listaNu");
        contacto.setCodigoLista(milista);
        milista.getContactoList().add(contacto);
        model.addAttribute("lista", milista);
        model.addAttribute("contactos", milista.getContactoList());
        return "discotecas/reserva2";
    }

    @RequestMapping(method = RequestMethod.GET)
    public String confirmar( ModelMap model , HttpServletRequest req ) {
        logger.debug("metodo confirmar GET");
        Discoteca d = (Discoteca)req.getSession().getAttribute("discot");
        model.addAttribute("discoteca", d);
        Lista l = (Lista)req.getSession().getAttribute("listaNu");
        model.addAttribute("contactos", l.getContactoList());
        return "discotecas/finalizar";
    }

    @RequestMapping(method = RequestMethod.GET)
    public String delete(@RequestParam("codigo") Long id) {
	logger.debug(" metodo delete GET ---> eliminar " + id);
	return "redirect:index";
    }

    /**
     * Primer Metodo de facebbok
     * Ingreso a este metodo desde la lista donde agego amigos a mano
     * @param model
     * @return
     */
    @RequestMapping(method = RequestMethod.GET)
    public String importar( ModelMap model) {
	logger.debug(" metodo Importar GET --> traer amigos del facebook ");
        model.addAttribute( new Contacto() );
	return "discotecas/facebook";
    }

    /**
     * Cuando doy clic al boton buscar, <br/>
     * luego de haber ingresado el token del facebook<br/>
     * @param contacto
     * @param result
     * @param model
     * @param request
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public String amigos( @Valid Contacto contacto,BindingResult result, ModelMap model,HttpServletRequest request) {
        try {
            logger.debug("metodo amigos POST -->  buscando a sus amigos del facebook ");
            String id = contacto.getFacebooktoken();
            FacebookClient facebookClient = new DefaultFacebookClient(id);
            Lista milista = (Lista)request.getSession().getAttribute("listaNu");
            Connection<User> myFriends = facebookClient.fetchConnection("me/friends", User.class, Parameter.with("fields", "id, name, picture"));
            request.getSession().setAttribute("amigosface", myFriends);
            Lista l = new Lista();
            Contacto cc = null;
            for (User amigo : myFriends.getData()) {
                cc = new Contacto();
                cc.setFacebooktoken(amigo.getId());
                cc.setNombre(amigo.getName());
                cc.setFoto(amigo.getPicture());
                l.getContactoList().add(cc);
            }
            model.addAttribute("lista", milista);
            model.addAttribute("contactos", l.getContactoList());
        } catch (FacebookException ex) {
            ex.printStackTrace();
            //retornara los valores de las lista con los contactos del face.
           return "discotecas/facebook";
        }
        return "discotecas/facebook2";
    }

    /**
     * Tercer metodo de facebook<br/>
     * cuando selecciono a msi amigos del facebook y doi clic en grabar<br/>
     * agrego a los seleccioados en la lisa unica i los muestro en pantalla
     * @param request
     * @param model
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public String grabaAmigos(HttpServletRequest request,ModelMap model){
        logger.debug("metodo grabaamigos POST --> Muestra los amigos que he seleccionado");
        Lista milista = (Lista)request.getSession().getAttribute("listaNu");
        String[] lis = request.getParameterValues("selec");
        Connection<User> face = (Connection<User>)request.getSession().getAttribute("amigosface");
        Hashtable<String,User> usuario = new Hashtable<String, User>();
        for(User us : face.getData()){
            usuario.put(us.getId(), us);
        }
        List<Contacto> amigos = milista.getContactoList();
        User con = null;
        for(String co : lis){
            con = usuario.get(co);
            amigos.add(new Contacto(con.getId(),con.getName(),con.getPicture(),milista));
        }
        model.addAttribute("lista", milista);
        model.addAttribute("amigos", amigos);
        return "discotecas/facebook3";
    }

    /**
     * Cuarto metodo del facebook<br/>
     * cuando visualizo la lista de todos los amigos (ingresados a mano y del facebook)<br/>
     * presiono finalizar i los envio a la bd<br/>
     * @param request
     * @param model
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public String finalizaAmigos(HttpServletRequest request,ModelMap model){
        logger.debug("finalizaAmigos POST --> ahora muestro a todos los amigos que he agregado en una sola lista ");
        //List<Contacto> amigos = (List<Contacto>)request.getSession().getAttribute("amigos");
        Lista milista = (Lista)request.getSession().getAttribute("listaNu");
        logger.debug("contactos = "+milista.getContactoList().size());
       // milista.getContactos().addAll(amigos);
        model.addAttribute("discoteca", milista.getCodigoDiscoteca());
        //TODO: mandar a BD
        try {
        discotecaService.registraLista(milista);
        
        //TODO: traer de BD
        String codl = milista.getCodigo()+"";
        logger.debug("codigo de lista " + codl);
        milista = discotecaService.obtenerLista(codl);
        milista.setContactoList(discotecaService.listarContactos(codl));
        logger.debug(milista.toString());
        //TODO: enviar al request con el mismo nombre
        model.addAttribute("lista", milista);
        model.addAttribute("contactos", milista.getContactoList());
        request.getSession().setAttribute("amigosface",null);
        } catch (Exception e) {
          e.printStackTrace();
          request.setAttribute("msgError", e.getMessage());
          return "discotecas/facebook3";
       }
       
        return "discotecas/facebook4";
    }

    /**
     * Metodo que registra la lista unificada con todos los amigos <br/>
     * luego redireige a la pagina de inicio<br/>
     * @param req
     * @return
     reemplaado por finalizarAmigos
    @RequestMapping(method = RequestMethod.POST)
    public String finalizar( HttpServletRequest req ) {
        logger.debug(" metodo fianlizar POST ---> registrado en la bd");
        discotecaService.registraLista(null);
	return "redirect:intro";
    }*/
}
